package delphorm.web.aspect;

import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.springframework.aop.MethodBeforeAdvice;

import delphorm.entite.personne.DroitGroupe;
import delphorm.entite.personne.Utilisateur;
import delphorm.service.personne.IPersonne;
import delphorm.web.exception.SecuriteException;


public class VerifierAfficherUtilisateur implements MethodBeforeAdvice, Verif {
	IPersonne servicePersonne;
	
	public IPersonne getServicePersonne() {
		return servicePersonne;
	}
	public void setServicePersonne(IPersonne servicePersonne) {
		this.servicePersonne = servicePersonne;
	}
	
	public void before(Method method, Object[] arguments, Object target) 
			throws Throwable {
		Object[] args = new Object[2];
		args[0] = ((HttpServletRequest)arguments[0]).getSession().getAttribute("utilisateur");
		args[1] = new Long(Long.parseLong((String)((HttpServletRequest)arguments[0]).getParameter("idutilisateur")));
						 
		if(!doVerif(args))
			throw new SecuriteException("exception.afficherutilisateur.pasledroit");
		
	}
	
	public boolean doVerif(Object[] objects) {
		Utilisateur utilisateur = (Utilisateur)objects[0];
		Long idUtilisateur = (Long)objects[1];
		//l'utilisateur s'affiche lui-même
		if(utilisateur.getId().equals(idUtilisateur))
			return true;
		//l'utilisateur a le droit Voir tous les utilisateurs
		else if(utilisateur.getDroitsGeneraux().getVoirTousUtilisateurs().booleanValue() == true)
			return true;
		//Ben et Sophie sont membres d'un même groupe, et Ben a le droit VoirUtilisateursGroupe
		else
		{
			//récupère l'utilisateur
			Utilisateur autreUtilisateur = servicePersonne.chercherUtilisateurParId(idUtilisateur);
			//récupère les groupes en commun
			Set droitsCommuns = utilisateur.droitsGroupesCollectifsCommuns(autreUtilisateur);
			//cherche si l'utilisateur peut modifier 
			Iterator it = droitsCommuns.iterator();
			while(it.hasNext())
			{
				DroitGroupe dg = (DroitGroupe)it.next();				
				if(dg.getVoirUtilisateursGroupe().booleanValue() == true)
					return true;
			}
		}
		return false;
	}

	

}
